perm filename UP2DDT.FAI[SS,SYS] blob
sn#498726 filedate 1980-04-11 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 P2NUM P1DDTF P1CHRI P1FLGO P1BPTO P1BPTX P1OCNT NOP2HG P2UPTI P2TSUP ACWPRV INTELF BUFSIZ A B C D P LPDL PDL DDTACT START GETDDT DDTWAT INDDT LISTEN NOACW NOP2 MAIN GOTALT NOTALT GOTCH NOCTL NOIN CDISMI REINIT LEAVE LOST YESCHK CPOPJ PRUPTM DECOUT DECOUR
C00015 ENDMK
C⊗;
;P2NUM P1DDTF P1CHRI P1FLGO P1BPTO P1BPTX P1OCNT NOP2HG P2UPTI P2TSUP ACWPRV INTELF BUFSIZ A B C D P LPDL PDL DDTACT START GETDDT DDTWAT INDDT LISTEN NOACW NOP2 MAIN GOTALT NOTALT GOTCH NOCTL NOIN CDISMI REINIT LEAVE LOST YESCHK CPOPJ PRUPTM DECOUT DECOUR
TITLE UP2DDT -- PROGRAM TO CONTROL P2 EDDT FROM P1
P2NUM←←210 ;P2COMM CELL FLAGS P2 RUNNING
P1DDTF←←213 ;P2COMM CELL TO SETOM TO GET P2 INTO DDT
P1CHRI←←214 ;P2COMM CELL TO PUT CHAR INTO FOR I/P
P1FLGO←←215 ;P2COMM CELL GETS +N TO READ O/P INTO N-CHAR BUFFER
; 0 MEANS HOLD O/P, -1 WHEN NOT IN USE
P1BPTO←←216 ;P2COMM CELL HOLDING BPT USED TO STORE O/P
P1BPTX←←217 ;P2COMM CELL HOLDING INITIAL VALUE FOR P2BPTO
P1OCNT←←220 ;P2COMM CELL WITH SIZE IN CHARS OF O/P BUFFER
NOP2HG←←221 ;SET TO -1 TO TELL P1 NOT TO HUNG TIMEOUT P2 DEVICES
P2UPTI←←222 ;P2 SYSTEM'S UPTIME IN TICKS
P2TSUP←←223 ;SET TO -1 TO SUPPRESS TYPEOUT ON P2 CTY WHILE WE'RE HERE
ACWPRV←←40
INTELF←←100000 ;VERY LIKELY INTERRUPT
BUFSIZ←←36 ;SIZE OF TTY OUTPUT BUFFER IN WORDS
A←1
B←2
C←3
D←4
P←17
LPDL←←20
PDL: BLOCK LPDL
;DDT's special activation table! Taken from DDT[S,SYS].
;Don't activate on operators, only on commands that don't require altmode.
DDTACT: 777777,,777764 ;Don't activate on ↑U, space, double quote, number-sign
000100,,032400 ;Do activate on /:;=?
000000,,374000 ;Do activate on [\]↑← and left quote
000001,,400020 ;Don't activate on BS -- BSACT gives us BS in empty line
START: RESET
MOVE P,[IOWD LPDL,PDL]
SETZM LEAVEF ;NOT TIME TO EXIT YET
MOVSI A,ACWPRV ;NEED ACW TO GET P2COMM INTO HISEG
SETPRV A,
TLNN A,ACWPRV ;GOT IT?
JRST NOACW ;OH WELL
P2UUO 4, ;GET P2 INTO HISEG
JRST NOP2 ;CAN'T
PUSHJ P,PRUPTM ;TYPE P2'S UPTIME
SKIPN 400000+P2NUM ;WARN USER IF P2 ISN'T RUNNING
OUTSTR [ASCIZ /P2SYS not running. (P2NUM zero)
/]
OUTSTR [ASCIZ/Suppress P1 hung timeouts for P2 devices? /]
PUSHJ P,YESCHK ;SKIP IF ANSWER IS NO
SETOM 400000+NOP2HG
MOVE A,400000+P1BPTX ;INITIAL VALUE FOR O/P BPT
MOVEM A,400000+P1BPTO ;START O/P BPT
MOVE B,400000+P1OCNT ;HOW MANY CHARS FIT IN BUFFER
MOVEM B,400000+P1FLGO ;START COUNT
OUTSTR [ASCIZ/Suppress typeout on P2 CTY? /]
PUSHJ P,YESCHK ;SKIP IF NO
SETOM 400000+P2TSUP ;YES, SET SUPPRESS FLAG
OUTSTR [ASCIZ/Send P2 to DDT now? /]
PUSHJ P,YESCHK ;SKIP IF ANSWER IS NO
JRST GETDDT
MOVEI A,[ASCIZ/OK, you're parallel to the P2 CTY.
/]
SKIPGE 400000+P2TSUP ;SKIP UNLESS SUPPRESSING P2 CTY TYPEOUT
MOVEI A,[ASCIZ/OK, you're the P2 CTY.
/]
OUTSTR (A)
JRST LISTEN
GETDDT: SETOM 400000+P1DDTF ;TELL P2 TO GO TO DDT
MOVEI A,1 ;WAIT FOR IT TO GET THERE
SLEEP A,
SKIPE 400000+P1DDTF ;IN DDT YET?
SLEEP A,
SKIPE 400000+P1DDTF ;IN DDT YET?
SLEEP A,
SKIPE 400000+P1DDTF ;IN DDT YET?
SLEEP A,
SKIPE 400000+P1DDTF ;IN DDT YET?
SLEEP A, ;GIVE IT ONE MORE CHANCE
SKIPN 400000+P1DDTF ;IN DDT YET?
JRST INDDT ;YES, OK
OUTSTR [ASCIZ /You'll have to get P2 into DDT manually.
/]
DDTWAT: MOVEI A,1 ;WAIT FOR P2 IN DDT
SLEEP A,
SKIPE 400000+P1DDTF
JRST DDTWAT
INDDT: OUTSTR [ASCIZ /OK, you're in P2 EDDT.
/]
LISTEN: SETACT [DDTACT] ;USE SAME SPECIAL ACTIVATION TABLE AS DDT
MOVE A,[-2,,[11000,,200↔001000,,100]]
TTYSET A, ;NO ECHOING, LET P2 DO IT
MOVEI A,CDISMI
MOVEM A,JOBAPR↑
MOVEI A,INTELF
INTENB A,
MOVE A,[400006,,MAIN]
SPCWGO A,
CLKINT 4*=60*=60 ;RUN EVERY 4 MINUTES TO AVOID AUTOLOGOUT
IWAIT
SKIPN LEAVEF ;TIME TO GO?
JRST .-2 ;NO, LOOP FOREVER
EXIT ;STAGE RIGHT
NOACW: OUTSTR [ASCIZ /You must have ACWPRV to run this program.
/]
EXIT
NOP2: OUTSTR [ASCIZ /I can't access P2 memory. Try FIXP2.
/]
EXIT
MAIN: JRST 2,@[.+1] ;OUT OF WONDERFUL IOT-LOSER MODE
SKIPE 400000+P1CHRI ;DON'T LOSE A CHAR
JRST NOIN
AOSE ALTMOD# ;DID WE JUST READ AN ALTMODE?
JRST NOTALT
INCHRS A
JRST GOTALT ;STILL LOOKING FOR CHAR AFTER ALTMODE
MOVEI B,(A)
ANDI B,177 ;NO BITS
CAIL B,"0" ;IF CHAR AFTER ALTMODE IS A DIGIT,
CAILE B,"9" ; THEN WE STILL WANT TO ACTIVATE ON SINGLE CHAR
JRST GOTCH ;NOT A DIGIT
SETOM ALTMOD ;SO STILL ACTIVATE ON SINGLE CHAR
JRST GOTCH ;GO PASS THE DIGIT ALONG
GOTALT: SETOM ALTMOD ;HAVEN'T SEEN A CHAR SINCE THE ALTMODE
JRST NOIN
NOTALT: INCHSL A ;USER WANT TO TYPE INPUT?
JRST NOIN ;ALREADY I/P FOR P2, OR NOTHING TYPED, TRY FOR O/P
GOTCH: CAIN A,15
INCHRS B ;DISCARD LF
JFCL
CAIE A,705
CAIN A,745
JRST LEAVE ;CONTROL-META-E
CAIE A,305
CAIN A,345
JRST LEAVE ;CONTROL-E
CAIN A,5
JRST LEAVE ;ASCII CONTROL-E
CAIN A,175
SETOM ALTMOD ;FLAG THAT NEXT CHAR SHOULD ACTIVATE
TRNN A,200 ;SAIL CONTROL BIT ON?
JRST NOCTL ;NO
ANDI A,177 ;YES, CONVERT TO ASCII CONTROL
CAIGE A,100
JRST NOCTL ;CAN'T CONTROLIFY THIS SMALL A CODE
CAIL A,140
SUBI A,40 ;CONVERT LC TO UC FIRST
SUBI A,100 ;CONTROLIFY THE CHAR
NOCTL: ANDI A,177 ;WHO KNOWS WHAT P2 DOES WITH BUCKY BITS
MOVEM A,400000+P1CHRI ;GIVE CHAR TO P2
NOIN: MOVE A,400000+P1BPTX ;IS THERE ANY OUTPUT WAITING?
CAMN A,400000+P1BPTO ;(INITIAL BPT DIFFERENT FROM CURRENT BPT?)
CDISMI: DISMIS ;NO, NO MORE TO DO
SETZB B,C
PTOCNT B ;GET COUNT OF CHARS STILL IN OUR OUTPUT BUFFER
ADD C,400000+P1OCNT ;MAX NUMBER OF CHARS WE MIGHT GET FROM P2
CAIL C,BUFSIZ*4-1-30 ;IS THERE ENOUGH ROOM IN OUR OUTPUT BUFFER?
;the 30 above is to allow P2 to deposit more chars during the OUTSTR below!
DISMIS ;NO, WAIT TILL LATER TO TRY READING FROM P2
MOVEI B,0 ;YES, FIRST FREEZE P2 OUTPUT
EXCH B,400000+P1FLGO ;WAS IT ALREADY FROZEN?
JUMPG B,.-2 ;NO, WAIT FOR THINGS TO SETTLE DOWN
JUMPL B,LOST ;WE WAITED TOO LONG, P2 TURNED US OFF
MOVE C,400000+P1BPTO ;OK, GET O/P BPT
ADDI C,400000 ;MAKE IT RELATIVE TO HISEG ORIGIN
IDPB B,C ;MAKE SURE OUTPUT STRING ENDS WITH A NULL
OUTSTR 400000(A) ;TYPE THE STUFF (WE BETTER BE FASTER THAN 110 BAUD!)
REINIT: MOVEM A,400000+P1BPTO ;RESTART O/P BPT
MOVE B,400000+P1OCNT ;HOW MANY CHARS FIT IN BUFFER
MOVEM B,400000+P1FLGO ;RESTART COUNT
DISMIS
LEAVE: SETOM 400000+P1FLGO ;NO LONGER READING OUTPUT
SETZM 400000+NOP2HG ;NO LONGER PREVENTING P2 HUNG TIMEOUTS
SETZM 400000+P2TSUP ;NO LONGER SUPPRESSING P2 CTY TYPEOUT
SETOM LEAVEF# ;TELL MAIN PROGRAM TO LEAVE
INTIPI [0↔INTELF]
JFCL
SPCWAR 'SSW' ;FLUSH
DISMIS
LOST: OUTSTR [ASCIZ / (lost some!) /]
JRST REINIT
YESCHK: INCHRW A
CAIN A,15
INCHRW B ;DISCARD LF
CAIE A,15
OUTSTR [ASCIZ/
/]
ANDI A,137 ;NO BUCKY BITS, UPPER CASE ONLY
CAIE A,"Y"
AOS (P)
CPOPJ: POPJ P,
PRUPTM: OUTSTR [ASCIZ\P2 uptime is: \]
MOVE A,400000+P2UPTI ;GET P2'S UPTIME IN TICKS
IDIVI A,=60 ;TICKS IN B, SECONDS IN A
PUSH P,B
IDIVI A,=60 ;SECONDS IN B, MINUTES IN A
PUSH P,B
IDIVI A,=60 ;HOURS IN A, MINUTES IN B
PUSH P,B
IDIVI A,=24 ;DAYS IN A, HOURS IN B
PUSH P,B
MOVEI C,0 ;HAVEN'T PRINTED ANYTHING YET
MOVEI D,[ASCIZ/ day/]
PUSHJ P,DECOUT ;PRINT DECIMAL NUMBER OF DAYS
POP P,A
MOVEI D,[ASCIZ/ hour/]
PUSHJ P,DECOUT ;PRINT NUMBER OF HOURS
POP P,A
MOVEI D,[ASCIZ/ min/]
PUSHJ P,DECOUT ;PRINT MINUTES
POP P,A
MOVEI D,[ASCIZ/ sec/]
PUSHJ P,DECOUT ;PRINT SECONDS
POP P,A
MOVEI D,[ASCIZ/ tick/]
PUSHJ P,DECOUT ;PRINT TICKS
SKIPN C
OUTCHR ["0"] ;DIDN'T PRINT ANYTHING, MUST BE 0 UPTIME
OUTSTR [ASCIZ /
/]
POPJ P,
DECOUT: SKIPN C ;HAVE WE ALREADY PRINTED SOMETHING?
JUMPE A,CPOPJ ;NO, THEN DON'T PRINT A LEADING ZERO QUANTITY
SKIPE C ;OMIT LEADING COMMA
OUTSTR [ASCIZ /, /]
ADDI C,1 ;COUNT FIELDS (MAINLY BE NON-ZERO)
PUSH P,A
PUSHJ P,DECOUR ;PRINT NUMBER
POP P,A
OUTSTR (D) ;PRINT UNITS
CAIE A,1
OUTCHR ["s"]
POPJ P,
DECOUR: IDIVI A,=10
HRLM B,(P)
SKIPE A
PUSHJ P,DECOUR ;NEXT DIGIT
HLRZ A,(P)
ADDI A,"0"
OUTCHR A
POPJ P,
END START